package com.xyy.saas.payment.adpater.jd.utils;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.internal.Primitives;
import com.xyy.saas.payment.util.DateUtil;
import org.apache.commons.lang3.StringUtils;

import java.lang.reflect.Type;

/*************************************************
 * Gson工具类，对Google的gson工具进行封装
 * (1)日期格式yyyyMMddHHmmss
 * (2)toJson时支持掩码
 * (3)toJson时支持跳过指定属性
 *************************************************/
public class JDGsonUtil {
    private static final String DEFAULT_DATE_PATTERN = DateUtil.YYYYMMDDHHMMSS;
    private static Gson defaultGson;

    static {
        GsonBuilder builder = new GsonBuilder();
        builder.setDateFormat(DEFAULT_DATE_PATTERN);
        defaultGson = builder.create();
        defaultGson.toJson(null);
    }

    public static <T> T fromJson(String json, Class<T> classOfT) {
        Object object = fromJson(json, classOfT, null);
        return Primitives.wrap(classOfT).cast(object);
    }

    /**
     * 将json串转化为目标对象
     * @param json        json串
     * @param type        目标对象类型
     * @param datePattern json串中日期格式，若为null，则按两个标准日期尝试解析：DEFAULT_DATE_PATTERN和DEFAULT_DATE_PATTERN_1
     * @return 目标对象
     */
    public static <T> T fromJson(String json, Type type, String datePattern) {
        if (StringUtils.isBlank(json)) {
            return null;
        }
        if (StringUtils.isBlank(datePattern)) {
            try {
                return defaultGson.fromJson(json, type);
            } catch (Exception ignore) { }
            return null;
        }
        try {
            Gson gson = getGson(datePattern);
            return gson.fromJson(json, type);
        } catch (Exception ignore) {
        }
        return null;
    }

    private static Gson getGson(String datePattern) {
        GsonBuilder builder = new GsonBuilder();
        builder.setDateFormat(datePattern);
        return builder.create();
    }

}
